home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / compuserve-file-archive / 12 C64 Telecom / TERMC1.ASM < prev    next >
Encoding:
Assembly Source File  |  2019-04-13  |  23.2 KB  |  1,102 lines

  1. ;**************************************************
  2. ;*                                                *
  3. ;*      t e r m . c 1  (new punter protocol)      *
  4. ;*      ------------------------------------      *
  5. ;*                                                *
  6. ;*               source = s/term.c1               *
  7. ;*               object = o/term.c1               *
  8. ;*                                                *
  9. ;*   this new punter protocol features adjust-    *
  10. ;* able data length (40-255 bytes), new hand-     *
  11. ;* shaking signals, and faster up/downloads.      *
  12. ;*                                                *
  13. ;*    - commented disassembly  by tom hughes -    *
  14. ;*                                                *
  15. ;*                    v081284                     *
  16. ;*                                                *
  17. ;**************************************************
  18. .skip
  19. ;
  20. ;c-64 equates
  21. ;
  22. .skip
  23. z62    = $62 ;sys jump value/counter
  24. z64    = $64 ;buffer pointer-lo
  25. z65    = $65 ;  ''     ''   -hi
  26. z96    = $96 ;psuedo-st register
  27. ;                         0 = ok
  28. ;                         1 = all bytes received ???
  29. ;                         2 = receive buffer empty
  30. ;                         4 = some bytes received
  31. ;                         8 = $c806/c807 = 0
  32. zba    = $ba ;current device #
  33. zf7    = $f7 ;rs-232 input buffer pointer-lo
  34. zf8    = $f8 ;  ''     ''    ''      ''  -hi
  35. .skip
  36. x0200  = $0200 ;rs-232 byte/flag: block size
  37. x028d  = $028d ;keybrd flag: 2 = cmdr pressed
  38. x029b  = $029b ;ptr: end of rs-232 input buffer
  39. x029c  = $029c ;ptr: start   ''      ''    ''
  40. x02a1  = $02a1 ;rs-232 enables
  41. .skip
  42. rs2set = $ef7e ;enable rs-232 byte reception
  43. chkin  = $ffc6 ;ready channel for output
  44. chrin  = $ffcf ;input char to channel
  45. chkout = $ffc9 ; ''     ''     '' input
  46. chrout = $ffd2 ;output char to channel
  47. clrchn = $ffcc ;i/o to default (screen)
  48. getin  = $ffe4 ;get char from keyboard
  49. readst = $ffb7 ;read/clear i/o status word
  50. .page 'program storage'
  51. xc800  = $c800 ;3-letter handshake
  52. xc801  = $c801 ;    ''       ''
  53. xc802  = $c802 ;    ''       ''
  54. xc803  = $c803 ;sc051 loop counter (1,2,4,8,16,32)
  55. xc804  = $c804 ;sc051 handshake ptr (0,3,6,9,12 or 15)
  56. xc805  = $c805 ;sc051 entry value (0,4,8,11 or 16)
  57. xc806  = $c806 ;sc051/sc27f flag: $ff=hshake rec'd
  58. xc807  = $c807 ;    ''       ''         ''
  59. xc808  = $c808 ;handshake index (0,3,6,8,12)
  60. xc809  = $c809 ;# bytes in block/counter ???
  61. xc80a  = $c80a ;(unused)
  62. xc80b  = $c80b ;delay flag: 0=no delay if $c80c < 3
  63. xc80c  = $c80c ;sc55e counter (0-3)
  64. xc80d  = $c80d ;rec/xmit flag: 0 = 1st block
  65. xc80e  = $c80e ;sc484 checksum workspace
  66. xc80f  = $c80f ;  ''     ''       ''
  67. xc810  = $c810 ;  ''     ''       ''
  68. xc811  = $c811 ;  ''     ''       ''
  69. xc812  = $c812 ;sc380 checksum workspace
  70. xc813  = $c813 ;  ''     ''       ''
  71. xc814  = $c814 ;  ''     ''       ''
  72. xc815  = $c815 ;  ''     ''       ''
  73. xc816  = $c816 ;$64/65 offset
  74. xc817  = $c817 ;# bytes to send (set by $c904) ???
  75. xc818  = $c818 ;block size (40-255)
  76. xc819  = $c819 ;counter/flag: $ff for xmit start ???
  77. xc81a  = $c81a ;      ''
  78. xc81b  = $c81b ;filetype (1=prg, 2=seq, 3=wordpro)
  79. xc81c  = $c81c ;entry stack pointer
  80. xc81d  = $c81d ;xmit flag: 0=short blk/1=long blk
  81. xc81e  = $c81e ;xmit flag: 0=send "goo"/1=send "syn"
  82. .skip 2
  83. ;
  84. ;block header format ($c900=rec buff/$ca00=xmit buff)
  85. ;
  86. .skip
  87. xc900  = $c900 ;checksum 1 - sum
  88. xc901  = $c901 ;    ''       ''
  89. xc902  = $c902 ;checksum 2 - eor
  90. xc903  = $c903 ;    ''       ''
  91. xc904  = $c904 ;# bytes in header (7)
  92. xc905  = $c905 ;# bytes in block ???
  93. xc906  = $c906 ;error flag: $ff=???
  94. xc907  = $c907 ;filetype (1-3)
  95. .page 'jumps & data'
  96. * = $c000 ;start @ 49152
  97. .skip
  98. ;
  99. ;sys "adjustable" jump values
  100. ;
  101. .skip
  102. lda #0 ;sys 49152
  103. .byt $2c
  104. lda #3 ;sys 49155 (receive data-2)
  105. .byt $2c
  106. lda #6 ;sys 49158 (transmit data-2)
  107. .byt $2c
  108. lda #9 ;sys 49161 (receive data-1)
  109. .byt $2c
  110. lda #12 ;sys 49164 (transmit data-1)
  111. .byt $2c
  112. lda #15 ;sys 49167 (terminal mode)
  113. nop
  114. jmp jc018 ;set adjustable jump
  115. .skip
  116. jmp sc59b ;sys 49173 (rs-232 settup)
  117. .skip
  118. jc018 sta z62 ;(0,3,6,9,12,15)
  119. tsx
  120. stx xc81c ;save current stack ptr
  121. lda #$30
  122. clc
  123. adc z62
  124. sta adjump+1 ;set jump-lo
  125. lda #>adjump
  126. adc #0
  127. sta adjump+2 ;set jump-hi
  128. adjump jmp $0000
  129. .skip
  130. ;
  131. ;jump table
  132. ;
  133. jmp sc051 ;(sys 49152)
  134. jmp sc408 ;receive 2 (sys 49155)
  135. jmp sc3d0 ;transmit 2 (sys 49158)
  136. jmp sc4ce ;receive 1 (sys 49161)
  137. jmp sc517 ;transmit 1 (sys 49164)
  138. jmp sc5aa ;terminal mode (sys 49167)
  139. .skip
  140. ;
  141. ;handshake signals (sent by sc124)
  142. ;
  143. hshake = * ;indexed by .y & $c808
  144. .byt 'goo' ;.y = 0  (go)  ???
  145. .byt 'bad' ;.y = 3  (bad block)
  146. .byt 'ack' ;.y = 6  (acknowledge)
  147. .byt 's/b' ;.y = 9  (send block) ???
  148. .byt 'syn' ;.y = 12 (bbs ready) ???
  149. .page 'receive handshake'
  150. ;----------------------------------------
  151. ;sc151: check for bbs handshake
  152. ;----------------------------------------
  153. .skip
  154. ;entry: if .a = 0, don't check any
  155. ;               4, check for "ack" only
  156. ;               8,   ''   '' "s/b"  ''
  157. ;              11,   ''   '' "goo", "bad", or "s/b"
  158. ;              16,   ''   '' "syn" only
  159. ;exit: if received, $96 = 0 & $c806/c807 = 0
  160. ;      if not, $96 = 1
  161. .skip
  162. sc051 sta xc805 ;save entry value
  163. lda #0 ;clear handshake storage
  164. sta xc800
  165. sta xc801
  166. sta xc802
  167. .skip
  168. jc05f lda #0 ;clear counters/flags
  169. sta xc806
  170. sta xc807
  171. jc067 jsr sc67b ;cmdr key pressed? (if yes,exit)
  172. jsr sc0f2 ;get byte from rs-232 buffer
  173. lda z96 ;byte in buffer?
  174. bne bc0c9
  175. lda xc801 ;yes, store @ $c800-c802
  176. sta xc800
  177. lda xc802
  178. sta xc801
  179. lda x0200 ;rs-232 byte
  180. sta xc802
  181. lda #0
  182. sta xc804 ;handshake word ptr = 0
  183. lda #1
  184. sta xc803 ;set loop counter
  185. .skip
  186. ;validate bbs handshake
  187. ;
  188. bc08d lda xc805 ;(= 0,4,8,11 or 16)
  189. bit xc803 ;(= 1,2,4,8,16 or 32)
  190. beq bc0ab ;if equal, don't check hshake
  191. ldy xc804
  192. ldx #0
  193. bc09a lda xc800,x ;else get bbs handshake word
  194. cmp hshake,y ;same as table?
  195. bne bc0ab
  196. iny
  197. inx
  198. cpx #3
  199. bne bc09a
  200. jmp jc0be ;yes, set flags & get more bytes
  201. .page
  202. bc0ab asl xc803 ;times 2 (= 2,4,8,16 or 32)
  203. lda xc804 ;set to next handshake word
  204. clc
  205. adc #3
  206. sta xc804 ;bump index by 3
  207. cmp #15 ;last word?
  208. bne bc08d
  209. jmp jc05f ;yes, try again
  210. .skip
  211. ;handshake received from bbs
  212. ;
  213. jc0be lda #$ff ;set flags
  214. sta xc806
  215. sta xc807
  216. jmp jc067 ;and get more bytes
  217. .skip
  218. ;rs-232 input buffer empty ($96 = 2)
  219. ;
  220. bc0c9 inc xc806 ;bump counters/flags
  221. bne bc0d1
  222. inc xc807
  223. bc0d1 lda xc807
  224. ora xc806 ;handshake received?
  225. beq bc0ec ;yes, exit
  226. lda xc806
  227. cmp #7 ;???
  228. lda xc807
  229. cmp #20 ;hi-count < 20?
  230. bcc jc067
  231. .skip
  232. lda #1 ;no, set flag: hshake rec'd
  233. sta z96
  234. jmp sc55e ;delay/exit
  235. .skip
  236. bc0ec lda #0 ;flag: hshake received
  237. sta z96
  238. rts
  239. .page 'input rs-232 byte'
  240. ;----------------------------------------
  241. ;sc0f1: get byte from rs-232 buffer
  242. ;----------------------------------------
  243. .skip
  244. ;exit:  if byte, $0200 = byte/$96 = 0
  245. ;       if no byte, $0200 = 0/$96 = 2
  246. .skip
  247. sc0f1 nop
  248. sc0f2 tya ;preserve .y
  249. pha
  250. lda x029b
  251. cmp x029c ;input buffer empty?
  252. beq bc112
  253. ldy x029c
  254. lda (zf7),y ;no, get byte from buffer
  255. pha ;save
  256. inc x029c ;bump buffer pointer
  257. lda #0
  258. sta z96 ;set flag = 0
  259. pla
  260. sta x0200 ;store byte
  261. pla
  262. tay ;restore .y
  263. jmp jc11d
  264. .skip
  265. ;rs-232 buffer empty
  266. ;
  267. bc112 lda #2
  268. sta z96 ;set flag = 2
  269. lda #0
  270. sta x0200 ;store null byte
  271. pla
  272. tay ;restore .y
  273. .skip
  274. jc11d pha ;preserve .y
  275. lda #3
  276. sta zba ;screen = current device
  277. pla ;restore .y
  278. rts
  279. .page 'send handshake'
  280. ;----------------------------------------
  281. ;sc124: send handshake to bbs
  282. ;----------------------------------------
  283. .skip
  284. ;entry:  if .y = 0, "goo"
  285. ;          ''    3, "bad"
  286. ;          ''    6, "ack"
  287. ;          ''    9, "s/b"
  288. ;          ''   12, "syn"
  289. .skip
  290. sc124 ldx #5 ;ready modem for output
  291. jsr chkout
  292. ldx #0
  293. bc12b lda hshake,y
  294. jsr chrout ;handshake -> modem
  295. iny
  296. inx
  297. cpx #3 ;send 3 bytes
  298. bne bc12b
  299. jmp clrchn ;i/o to defaults, exit
  300. .skip 2
  301. ;----------------------------------------
  302. ;sc13a: send handshake, get data @ $c900
  303. ;----------------------------------------
  304. .skip
  305. ;entry:  .a = handshake word index (see above)
  306. ;             (0=1st block/1=all others)
  307. .skip
  308. sc13a sta xc808 ;save index
  309. lda #0
  310. sta xc80b ;flag: delay/exit if $c80c > 2
  311. jc142 lda #2
  312. sta z62 ;set attempt counter
  313. ldy xc808
  314. jsr sc124 ;send handshake
  315. bc14c lda #4
  316. jsr sc051 ;wait for bbs "ack"
  317. lda z96 ;received?
  318. beq bc15c
  319. dec z62
  320. bne bc14c
  321. jmp jc142 ;no, try again
  322. .page
  323. ;bbs "ack" received
  324. ;
  325. bc15c ldy #9
  326. jsr sc124 ;send "s/b" to bbs
  327. lda xc80d ;flag: 1st block?
  328. beq bc16b
  329. lda xc808 ;flag: last hshake = "goo"?
  330. beq bc18a ;yes, branch
  331. .skip
  332. ;receive 1st block (8 bytes)
  333. ;
  334. bc16b lda xc904 ;# of bytes to receive (8=start)
  335. sta xc809
  336. sta xc817
  337. jsr sc27f ;receive bbs data @ $c900
  338. lda z96
  339. cmp #1 ;all bytes received?
  340. beq bc189 ;yes, exit
  341. cmp #2 ;receive buffer empty?
  342. beq bc15c ;yes, send "s/b" again
  343. cmp #4 ;1 or more bytes received?
  344. beq bc189 ;yes, exit
  345. cmp #8 ;counters at max?
  346. beq bc15c ;yes, send "s/b" again
  347. bc189 rts ;$96 = 1 or 4
  348. .skip
  349. ;flag $c80d = 0 ("goo")
  350. ;
  351. bc18a lda #16
  352. jsr sc051 ;wait for bbs "syn"
  353. lda z96 ;received?
  354. bne bc15c ;no, send "s/b" again
  355. .skip
  356. lda #10
  357. sta xc809
  358. bc198 ldy #12
  359. jsr sc124 ;yes, send "syn" to bbs
  360. lda #8
  361. jsr sc051 ;wait for  "s/b"
  362. lda z96 ;received?
  363. beq bc1ab
  364. dec xc809 ;no, attempt 10 times
  365. bne bc198
  366. bc1ab rts ;$96 = 0 or 1
  367. .page 'buffer -> bbs'
  368. ;----------------------------------------
  369. ;sc1ac:  send $c809 bytes -> bbs
  370. ;----------------------------------------
  371. .skip
  372. ;exit: if .a = 0, good block
  373. ;        ''    1, bad block/last blk ???
  374. .skip
  375. sc1ac lda #1
  376. sta xc80b ;flag: delay/exit
  377. bc1b1 lda xc81e ;flag: 1=send "goo"/0=no "goo"
  378. beq bc1bb
  379. ldy #0
  380. jsr sc124 ;send "goo"
  381. bc1bb lda #11
  382. jsr sc051 ;wait for "goo", "bad" or "s/b"
  383. lda z96 ;one received?
  384. bne bc1b1 ;no, try again
  385. .skip
  386. ;either "goo", "bad" or "s/b" received
  387. ;
  388. lda #0
  389. sta xc81e ;flag: 0=no "goo"
  390. lda xc804 ;was "goo" received?
  391. cmp #0
  392. bne bc205 ;no, print ":", send "ack" & header, exit
  393. .skip
  394. ;"goo" received
  395. ;
  396. lda xc80d ;flag: 1st block?
  397. bne bc23d ;yes, print "*", send "ack" & "s/b",exit
  398. inc xc819 ;(= 0 for 1st blk)
  399. bne bc1dd
  400. inc xc81a ;(= 0 for 1st blk)
  401. bc1dd jsr sc364 ;set $64/65 = $ca00
  402. ldy #5
  403. iny
  404. lda (z64),y ;$ca06 = $ff? (start?)
  405. cmp #$ff
  406. bne bc1ff ;no, disk -> buffer
  407. lda #1
  408. sta xc80d ;flag: not 1st block
  409. lda xc816
  410. eor #%00000001
  411. sta xc816 ;reset $64/65 = $c900
  412. jsr sc364
  413. jsr sc344 ;compute block checksum
  414. jmp jc202 ;send "ack" & $c809 bytes
  415. .page
  416. ;disk -> buffer  ($c906/ca06 <> $ff)
  417. ;
  418. bc1ff jsr sc2ff ;disk -> buffer
  419. jc202 lda #'- ;"-" = good block
  420. .byt $2c
  421. bc205 lda #': ;":" = bad block
  422. jsr sc586 ;print "-" or ":" (if $c80d = 0)
  423. ldy #6
  424. jsr sc124 ;send "ack"
  425. lda #8
  426. jsr sc051 ;wait for bbs "s/b"
  427. lda z96 ;received?
  428. bne jc202 ;no, try again
  429. .skip
  430. ;bbs "s/b" received, send $c809 bytes
  431. ;
  432. jsr sc364 ;set $64/65 = $ca00 ???
  433. ldy #4
  434. lda (z64),y ;get # of bytes in header
  435. sta xc809 ;save
  436. jsr sc371 ;set $64/65 = $c900 ???
  437. ldx #5
  438. jsr chkout ;ready modem for output
  439. ldy #0
  440. bc22c lda (z64),y ;$c809 bytes -> bbs
  441. jsr chrout
  442. iny
  443. cpy xc809 ;# bytes in header ???
  444. bne bc22c
  445. jsr clrchn ;i/o to default
  446. lda #0
  447. rts
  448. .page
  449. ;send short block "*" ???
  450. ;entry: $c80d <> 0
  451. ;
  452. bc23d lda #'*
  453. jsr sc586 ;print "*"
  454. ldy #6
  455. jsr sc124 ;send "ack" to bbs
  456. lda #8
  457. jsr sc051 ;wait for bbs hshake (except "s/b")
  458. lda z96 ;received?
  459. bne bc23d ;no, send again
  460. .skip
  461. ;bbs handshake received
  462. ;
  463. lda #10
  464. sta xc809
  465. bc255 ldy #11
  466. jsr sc124 ;send "syn" to bbs
  467. lda #16
  468. jsr sc051 ;wait for bbs hshake (except "syn")
  469. lda z96 ;received?
  470. beq bc268
  471. dec xc809 ;n0, try 10 times
  472. bne bc255
  473. .skip
  474. ;bbs handshake received
  475. ;
  476. bc268 lda #3
  477. sta xc809 ;set attempt counter
  478. bc26d ldy #9
  479. jsr sc124 ;send "s/b" 3 times
  480. lda #0
  481. jsr sc051 ;wait for any bbs handshake
  482. dec xc809 ;-1 from attempt counter
  483. bne bc26d
  484. lda #1 ;flag: error ???
  485. rts
  486. .page 'bbs -> buffer'
  487. ;----------------------------------------
  488. ;sc27f: receive bbs data @ $c900
  489. ;----------------------------------------
  490. .skip
  491. sc27f ldy #0
  492. bc281 lda #0
  493. sta xc806 ;clear attempt counters
  494. sta xc807
  495. jc289 jsr sc67b ;cmdr key pressed?
  496. jsr sc0f2 ;no, get rs-232 buffer byte
  497. lda z96 ;byte in buffer?
  498. bne bc2cf ;no, bump attempt count
  499. .skip
  500. ;rs-232 byte received
  501. ;
  502. lda x0200 ;get modem byte
  503. sta xc900,y
  504. cpy #3 ;3 handshake bytes received?
  505. bcs bc2b9 ;yes, skip
  506. .skip
  507. sta xc800,y
  508. cpy #2
  509. bne bc2b9
  510. lda xc800 ;first 3 bytes = "ack"?
  511. cmp #'a
  512. bne bc2b9
  513. lda xc801
  514. cmp #'c
  515. bne bc2b9
  516. lda xc802
  517. cmp #'k
  518. beq bc2c4 ;yes, branch
  519. .skip
  520. bc2b9 iny
  521. cpy xc809 ;all bytes received?
  522. bne bc281
  523. lda #1 ;yes, set flag = 1
  524. sta z96
  525. rts
  526. .skip
  527. ;"ack" received @ $c800-c802
  528. ;
  529. bc2c4 lda #$ff
  530. sta xc806 ;set flags to max
  531. sta xc807
  532. jmp jc289 ;get more bytes
  533. .page
  534. ;handle $96 <> 0
  535. ;
  536. bc2cf inc xc806 ;bump lo-counter
  537. bne bc2d7
  538. inc xc807 ;bump hi-counter
  539. bc2d7 lda xc806
  540. ora xc807 ;counters at max?
  541. beq bc2fa
  542. lda xc806
  543. cmp #6 ;???
  544. lda xc807
  545. cmp #16 ;no, hi-counter < 16?
  546. bne jc289 ;yes, try again
  547. lda #2
  548. sta z96 ;if no bytes, $96 = 2
  549. cpy #0
  550. beq bc2f7
  551. lda #4 ;if 1+ bytes, $96 = 4
  552. sta z96
  553. bc2f7 jmp sc55e ;delay & exit
  554. .skip
  555. bc2fa lda #8 ;if counters = 0, $96 = 8
  556. sta z96
  557. rts
  558. .page
  559. ;----------------------------------------
  560. ;sc2ff:  disk -> buffer
  561. ;----------------------------------------
  562. .skip
  563. sc2ff lda xc816 ;change current buffer
  564. eor #%00000001
  565. sta xc816
  566. jsr sc364 ;set $64/65 = $ca00 ???
  567. ldy #5
  568. lda xc819 ;l-address send buffer ???
  569. clc
  570. adc #1 ;+1
  571. sta (z64),y ;save @ $ca05/c905 ???
  572. iny
  573. lda xc81a ;h-address send buffer ???
  574. adc #0
  575. sta (z64),y ;save @ $ca06/c906 ???
  576. ldx #2
  577. jsr chkin ;ready ch 2 for input (disk)
  578. ldy #7
  579. bc323 jsr chrin ;get disk byte
  580. sta (z64),y ;save  @ $ca07 on ...
  581. iny
  582. jsr readst ;st = 0?
  583. bne bc338
  584. cpy xc818 ;$c818 bytes received?
  585. bne bc323
  586. tya
  587. pha ;preserve buffer pointer
  588. jmp jc345
  589. .skip
  590. ;st <> 0
  591. ;
  592. bc338 tya
  593. pha ;preserve buffer pointer
  594. ldy #5
  595. iny
  596. lda #$ff
  597. sta (z64),y ;set $ca06 = $ff
  598. jmp jc345
  599. .page 'checksum'
  600. ;----------------------------------------
  601. ;sc344: compute block checksum
  602. ;----------------------------------------
  603. .skip
  604. ;entry: .a = $c804 (handshake word index)
  605. ;exit:  $c809 = # bytes in block
  606. ;       $c904 =     ''    ''   ???
  607. ;       checksum in header @ xx00-xx03
  608. .skip
  609. sc344 pha ;save index
  610. .skip
  611. jc345 jsr clrchn ;i/o to defaults
  612. jsr sc59b ;enable byte reception
  613. jsr sc579 ;delay loop
  614. jsr sc59b ;enable byte reception
  615. ldy #4
  616. lda (z64),y ;get # of bytes in block
  617. sta xc809 ;save
  618. jsr sc371 ;set $64/65 = $c900
  619. pla ;get buffer pointer
  620. ldy #4
  621. sta (z64),y ;save as # bytes in block
  622. jsr sc380 ;compute block checksum
  623. rts
  624. .page 'set $64/65'
  625. ;----------------------------------------
  626. ;sc364: set $64/65 - ascending
  627. ;----------------------------------------
  628. .skip
  629. ;entry: if $c816 = 0, $64/65 = $c900
  630. ;            ''    1,   ''     $ca00
  631. .skip
  632. sc364 lda #0
  633. sta z64
  634. lda xc816 ;pointer offset
  635. clc
  636. adc #$c9 ;$c816 + $c9 = $65
  637. sta z65
  638. rts
  639. .skip 2
  640. ;----------------------------------------
  641. ;sc371: set $64/65 - change buffer
  642. ;----------------------------------------
  643. .skip
  644. ;entry: if $c816 = 0, $64/65 = $ca00
  645. ;             ''   1,    ''    $c900
  646. .skip
  647. sc371 lda #0
  648. sta z64
  649. lda xc816 ;pointer offset
  650. eor #%00000001 ;change buffer
  651. clc
  652. adc #$c9
  653. sta z65
  654. rts
  655. .page 'checksum 2'
  656. ;----------------------------------------
  657. ;sc380: compute block checksum
  658. ;----------------------------------------
  659. .skip
  660. ;entry: $c809 = # bytes in block
  661. ;exit:  $c814-c815 contains checksum
  662. ;       $c902-c903    ''       ''     ???
  663. .skip
  664. sc380 lda #0
  665. sta xc812 ;checksum 1 - sum of bytes
  666. sta xc813
  667. sta xc814 ;checksum 2 - eor of bytes
  668. sta xc815
  669. ldy #4 ;checksum from $c904 on in blk
  670. bc390 lda xc812
  671. clc
  672. adc (z64),y
  673. sta xc812
  674. bcc bc39e
  675. inc xc813
  676. bc39e lda xc814
  677. eor (z64),y
  678. sta xc814
  679. lda xc815
  680. rol a ;$c815 carry -> bit 0
  681. rol xc814 ;$c814 carry -> bit 0
  682. rol xc815 ;$c815      ''
  683. iny
  684. cpy xc809 ;end of block?
  685. bne bc390
  686. .skip
  687. ldy #0
  688. lda xc812 ;checksum 1 -> $c900/c901
  689. sta (z64),y
  690. iny
  691. lda xc813
  692. sta (z64),y
  693. iny
  694. lda xc814 ;checksum 2 -> $c902/c903
  695. sta (z64),y
  696. iny
  697. lda xc815
  698. sta (z64),y
  699. rts
  700. .page 'transmit 2'
  701. ;========================================
  702. ;sc3d0: transmit 2 - buffer to bbs
  703. ;========================================
  704. .skip
  705. ;exit: $0200 = 0
  706. .skip
  707. sc3d0 lda #0
  708. sta xc80d ;flag: 1st block?
  709. sta xc80c ;delay counter
  710. sta xc81d ;short blk # bytes ???
  711. lda #1
  712. sta xc816 ;transmit buffer @ $ca00
  713. lda #$ff
  714. sta xc819 ;set for xmit
  715. sta xc81a
  716. jsr sc371 ;set $64/65 = $c900
  717. ldy #4
  718. lda #7
  719. sta (z64),y ;$c904 = 7 (# header bytes)
  720. jsr sc364 ;set $64/65 = $ca00
  721. ldy #5
  722. lda #0
  723. sta (z64),y ;$ca05 = 0 (# block bytes-lo)
  724. iny
  725. sta (z64),y ;$ca06 = 0 (# block bytes-hi)
  726. bc3fd jsr sc1ac ;block(s) -> bbs ... ???
  727. beq bc3fd
  728. bc402 lda #0
  729. sta x0200 ;flag: end of transmission
  730. rts
  731. .page 'receive 2'
  732. ;========================================
  733. ;sc408: receive 2 - buffer to disk
  734. ;========================================
  735. .skip
  736. sc408 lda #1
  737. sta xc819 ;flag: receive ???
  738. lda #0
  739. sta xc81a ;???
  740. sta xc80d ;flag: 1st block
  741. sta xc816 ;receive buffer @ $c900
  742. sta xc905 ;# bytes in block  ???
  743. sta xc906 ;flag: $ff = short blk ???
  744. sta xc80c ;delay counter
  745. lda #7
  746. sta xc904 ;7 bytes in header
  747. lda #0
  748. jc428 jsr sc13a ;bbs data -> buffer $c900 ???
  749. lda xc80d ;flag: 1st block?
  750. bne bc402 ;yes, set $0200 = 0 & exit
  751. jsr sc484 ;block checksum ok?
  752. bne bc471
  753. .skip
  754. ;block ok, send to disk
  755. ;
  756. jsr clrchn ;i/o to defaults
  757. lda xc809 ;# bytes in block
  758. cmp #7 ;= 7 (just block header)? ???
  759. beq bc455
  760. ldx #2
  761. jsr chkout ;no, ready ch 2 for output (disk)
  762. ldy #7
  763. bc446 lda xc900,y ;$c907 to $c907+$c809 -> disk
  764. jsr chrout
  765. iny
  766. cpy xc809
  767. bne bc446
  768. jsr clrchn ;i/o to defaults
  769. .page
  770. ;just "header" or short block
  771. ;
  772. bc455 lda xc906
  773. cmp #$ff ;short block? ???
  774. bne bc464
  775. lda #1
  776. sta xc80d ;flag: 1st block
  777. lda #'* ;print "*"
  778. .byt $2c
  779. bc464 lda #'- ;no, print "-"
  780. jsr chrout
  781. jsr sc59b ;enable rs-232 byte reception
  782. lda #0 ;send "goo"
  783. jmp jc428 ;get next block
  784. .skip
  785. ;block checksum bad
  786. ;
  787. bc471 jsr clrchn ;i/o to defaults
  788. lda #': ;print ":"
  789. jsr chrout
  790. lda xc817 ;# bytes received ???
  791. sta xc904 ;save in block header
  792. lda #3 ;send "bad"
  793. jmp jc428 ;try again
  794. .page 'checksum 3'
  795. ;----------------------------------------
  796. ;sc484: verify checksum for bbs block
  797. ;----------------------------------------
  798. .skip
  799. ;entry: $c900-c903 = bbs block checksum
  800. ;exit:  if .a = 0, checksum ok
  801. ;          ''   1, bad checksum
  802. .skip
  803. sc484 lda xc900 ;checksum 1 - sum of bytes
  804. sta xc80e
  805. lda xc901
  806. sta xc80f
  807. lda xc902 ;checksum 2 - eor of bytes
  808. sta xc810
  809. lda xc903
  810. sta xc811
  811. jsr sc364 ;set $64/65 = $c900  ???
  812. lda xc817 ;# bytes in block
  813. sta xc809
  814. jsr sc380 ;compute block checksum @ $c900 ???
  815. lda xc900 ;checksum ok?
  816. cmp xc80e
  817. bne bc4cb
  818. lda xc901
  819. cmp xc80f
  820. bne bc4cb
  821. lda xc902
  822. cmp xc810
  823. bne bc4cb
  824. lda xc903
  825. cmp xc811
  826. bne bc4cb
  827. lda #0 ;yes, set .a = 0
  828. rts
  829. bc4cb lda #1 ;no, set .a = 1
  830. rts
  831. .page 'receive 1'
  832. ;========================================
  833. ;sc4ce: receive 1
  834. ;========================================
  835. .skip
  836. ;exit: if short block, $0200 = 0
  837. .skip
  838. sc4ce lda #0
  839. sta xc819 ;set flags
  840. sta xc81a
  841. sta xc80d ;flag: 1st block
  842. sta xc816 ;$64/65 = $c900
  843. sta xc80c ;delay counter
  844. lda #7
  845. clc
  846. adc #1
  847. sta xc904 ;# bytes to send = 8 (header+1)
  848. lda #0 ;start handshake = "goo"
  849. .skip
  850. jc4e9 jsr sc13a ;send handshake, get data
  851. lda xc80d ;flag: 1st block?
  852. bne bc511
  853. .skip
  854. jsr sc484 ;block checksum ok?
  855. bne bc506 ;no
  856. lda xc907 ;1st data byte of block
  857. sta xc81b ;= filetype
  858. lda #1
  859. sta xc80d ;flag: 1st block?
  860. lda #0 ;send "goo"
  861. jmp jc4e9 ;get next block
  862. .skip
  863. ;block checksum bad
  864. ;
  865. bc506 lda xc817 ;# bytes received
  866. sta xc904 ;save in header
  867. lda #3 ;send "bad"
  868. jmp jc4e9 ;try again
  869. .skip
  870. ;short block ($c80d <> 0)  ???
  871. ;
  872. bc511 lda #0 ;set flag
  873. sta x0200
  874. rts ;back to basic
  875. .page 'transmit 1'
  876. ;========================================
  877. ;sc517: transmit 1
  878. ;========================================
  879. .skip
  880. ;exit: if transmit ok, then $0200 = 0
  881. .skip
  882. sc517 lda #0
  883. sta xc80d ;flag: 0 = 1st block
  884. sta xc80c ;set delay counter ???
  885. lda #1
  886. sta xc816 ;set $64/65 = $ca00
  887. sta xc81d ;set short block flag ???
  888. lda #$ff
  889. sta xc819 ;flag: transmit  ???
  890. sta xc81a
  891. jsr sc371 ;set $64/65 = $c900
  892. ldy #4
  893. lda #7
  894. clc
  895. adc #1
  896. sta (z64),y ;$c904 = 8 (min # bytes to send)
  897. jsr sc364 ;set $64/65 = $ca00
  898. ldy #5
  899. lda #$ff
  900. sta (z64),y ;$ca05 = $ff
  901. iny
  902. sta (z64),y ;$ca06 = $ff
  903. ldy #7
  904. lda xc81b ;file type
  905. sta (z64),y ;$ca07 = file type (1-3)
  906. lda #1
  907. sta xc81e ;flag: wait for bbs "syn"
  908. bc553 jsr sc1ac ;send block(s)
  909. beq bc553
  910. lda #0
  911. sta x0200 ;flag: ???
  912. rts ;back to basic
  913. .skip 2
  914. ;----------------------------------------
  915. ;sc55e: transmit - delay exit  ???
  916. ;----------------------------------------
  917. .skip
  918. sc55e inc xc80c ;set @ 0 or 1
  919. lda xc80c
  920. cmp #3 ;< 3?
  921. bcc bc574
  922. lda #0 ;no, reset
  923. sta xc80c
  924. lda xc80b ;delay flag set?
  925. beq sc579 ;yes, delay & exit
  926. bne bc585 ;no, just exit
  927. .skip
  928. bc574 lda xc80b ;delay?
  929. beq bc585 ;no, quit
  930. .page 'misc subs'
  931. ;----------------------------------------
  932. ;sc579: delay
  933. ;----------------------------------------
  934. .skip
  935. sc579 ldx #0 ;set delay counters
  936. bc57b ldy #0
  937. bc57d iny
  938. bne bc57d
  939. inx
  940. cpx #$78
  941. bne bc57b
  942. bc585 rts
  943. .skip 2
  944. ;----------------------------------------
  945. ;sc586: send byte   ???
  946. ;----------------------------------------
  947. .skip
  948. ;entry: .a = byte to sent
  949. ;exit:  .a =   ''    ''
  950. .skip
  951. sc586 pha ;preserve byte
  952. lda xc819 ;flag: $ff for xmit ???
  953. ora xc81a
  954. beq bc599 ;yes, exit
  955. lda xc80d ;flag: 1st block
  956. bne bc599 ;yes,  exit
  957. pla
  958. jsr chrout ;send byte
  959. pha
  960. bc599 pla ;restore byte
  961. rts
  962. .skip 2
  963. ;========================================
  964. ;sc59b: enable rs-232 byte reception
  965. ;========================================
  966. .skip
  967. ;entry: device 2 (modem) must be opened
  968. .skip
  969. sc59b jsr rs2set ;enable
  970. lda x02a1 ;check for interrupts...
  971. cmp #%10000000 ;nmi?
  972. beq sc59b
  973. cmp #%10010010 ;waiting or receiving?
  974. beq sc59b
  975. rts ;none of the above
  976. .page 'terminal mode'
  977. ;========================================
  978. ;sc5aa: terminal mode
  979. ;========================================
  980. .skip
  981. sc5aa jsr sc667 ;print crsr, check cmdr key
  982. bc5ad jsr sc0f1 ;get rs-232 byte
  983. lda z96 ;byte received?
  984. bne bc5c8
  985. lda x0200 ;yes, get byte
  986. and #%01111111 ;make it 7-bit
  987. sta x0200
  988. cmp #8 ;ascii delete?
  989. beq bc5cb
  990. cmp #13 ;ascii c/r?
  991. beq bc5cb
  992. cmp #32 ;ascii space?
  993. bpl bc5cb ;any of the above
  994. .skip
  995. bc5c8 jmp jc615 ;check keyboard
  996. .skip
  997. bc5cb cmp #$61 ;ascii lowercase ($61-7a)?
  998. bcc bc5dc
  999. cmp #$7b
  1000. bcs bc5dc
  1001. sec ;yes, make cbm lowercase (-32)
  1002. sbc #32
  1003. sta x0200 ;save
  1004. jmp jc5ea
  1005. .skip
  1006. bc5dc cmp #$41 ;ascii uppercase ($41-5a)?
  1007. bcc jc5ea
  1008. cmp #$5b
  1009. bcs jc5ea
  1010. clc ;yes, make cbm uppercase (+128)
  1011. adc #128
  1012. sta x0200 ;save
  1013. .skip
  1014. jc5ea cmp #8 ;delete?
  1015. bne bc5f3
  1016. lda #20 ;yes, save cbm delete
  1017. sta x0200
  1018. bc5f3 cmp #34 ;quotes?
  1019. bne bc601
  1020. jsr chrout ;yes, print quotes
  1021. lda #20
  1022. jsr chrout ;+ delete
  1023. lda #34 ;save quotes
  1024. bc601 sta x0200
  1025. cmp #13 ;c/r?
  1026. bne bc60f
  1027. lda #32
  1028. jsr chrout ;yes, print space & c/r
  1029. lda #13
  1030. bc60f jsr chrout ;print char
  1031. jsr sc667 ;print crsr, cmdr pressed?
  1032. .skip
  1033. ;check for keyboard input
  1034. ;
  1035. jc615 jsr getin ;key pressed?
  1036. beq bc5ad ;no, check rs-232
  1037. sta x0200 ;yes, save keyboard char
  1038. cmp #19 ;home?
  1039. beq bc666 ;yes, exit to basic
  1040. cmp #$41 ;cbm lowercase ($41-5a)?
  1041. bcc bc632
  1042. cmp #$5b
  1043. bcs bc632
  1044. clc ;yes, make ascii lowercase (+32)
  1045. adc #32
  1046. sta x0200
  1047. jmp jc643
  1048. .skip
  1049. bc632 lda x0200
  1050. cmp #$c1 ;cbm uppercase-2 ($c1-da)?
  1051. bcc jc643
  1052. cmp #$db
  1053. bcs jc643
  1054. sec ;yes, make ascii uppercase (-128)
  1055. sbc #128
  1056. sta x0200
  1057. .skip
  1058. jc643 cmp #20 ;cbm delete?
  1059. bne bc64c
  1060. lda #8 ;yes, make ascii bs
  1061. sta x0200
  1062. bc64c cmp #$83 ;cbm shift/stop?
  1063. bne bc655
  1064. lda #16 ;yes, make ascii control p
  1065. sta x0200
  1066. bc655 ldx #5
  1067. jsr chkout ;ready rs-232 for output
  1068. lda x0200
  1069. jsr chrout ;send byte
  1070. jsr clrchn ;i/o to defaults
  1071. jmp sc5aa ;back to start...
  1072. bc666 rts ;if "home", exit to basic
  1073. .page 'crsr & cmdr'
  1074. ;----------------------------------------
  1075. ;sc667: print crsr, check if cmdr pressed
  1076. ;----------------------------------------
  1077. .skip
  1078. sc667 lda #18
  1079. jsr chrout ;print rvs on
  1080. lda #32
  1081. jsr chrout ;space
  1082. lda #157
  1083. jsr chrout ;crsr left
  1084. lda #146
  1085. jsr chrout ;and rvs off
  1086. .skip 2
  1087. ;----------------------------------------
  1088. ;sc67b: check if cmdr key pressed
  1089. ;----------------------------------------
  1090. .skip
  1091. ;exit: x0200 = 1 (exit to terminal mode)
  1092. .skip
  1093. sc67b lda x028d
  1094. cmp #2 ;cmdr pressed?
  1095. bne bc689
  1096. bc682 pla ;yes, pop stack
  1097. tsx
  1098. cpx xc81c ;till basic entry
  1099. bne bc682
  1100. bc689 lda #1 ;set flag
  1101. sta x0200
  1102.